import { getToken, setToken } from '@/utils/auth'
import { sysLogin, sysProfile, sysUser } from '@/api/user.js'
// 导入动态路由
import { asyncRoutes, constantRoutes } from '@/router/index.js'
//  import { Message } from 'element-ui' // Message====this.$message
import router from '@/router'
import { resetRouter } from '@/router'
const state = {
  token: getToken() || '',
  userInfo: ''
}
const mutations = {
  setToken(state, value) {
    state.token = value
    setToken(value)
  },
  setUserInfo(state, value) {
    state.userInfo = value
  },
  // 清除用户信息与token,重置路由（解决切换帐号时上一帐号的路由信息没有销毁重置）
  logout(state) {
    state.userInfo = ''
    state.token = ''
    setToken('')
    resetRouter()
  }
}
const actions = {
  async toLogin(store, form) {
    // try {
    const res = await sysLogin(form)
    store.commit('setToken', res.data)
    // } catch (error) {
    //   console.log(error)
    // }
    // if (res.success) {
    // store.commit('setToken', res.data)
    // } else {
    //   // 错误提示
    //   Message.error(res.message)
    //   // return undefined======return Promise.resolve(undefined)
    //   return Promise.reject(res.message)
    // }
  },
  // 获取用户信息
  /*
  获取用户头像等其它信息
 1:定义api
 2:导入调用（在获取用户信息完成后根据id调用）
 3:合并用户信息并存储
    对象合并  {...a,...b}
    对象合并  返回值(合并后的目标对象)=Object.assign(目标对象,需要合并的对象,....)
const res=async Promise.all([promise1,promise2])
res=[promise1返回值,promise2返回值]

  */
  async getUserInfo({ commit }) {
    // const res = await Promise.all([sysProfile(), sysProfile()])
    // console.log(res)
    const res = await sysProfile()
    const res2 = await sysUser(res.data.userId)
    // 合并对象
    const res3 = Object.assign({}, res.data, res2.data)
    commit('setUserInfo', res3)
    console.log('用户信息', res3)
    // 获取用户信息后  和动态路由匹配
    /*
  1:用户权限数据  res3.roles.menus
  2:动态路由数据  asyncRoutes
  匹配：就是从动态路由的数组中找到meta.name的值在用户权限数组中包含的项
    filter过滤数组
    找出是否包含 includes
  通过addRoutes动态路由到路由中
  vue2主体中会用addRoutes：添加多个路由
  vue3只能使用addRoute,添加单个路由
*/
    const newArr = asyncRoutes.filter((item) => {
      return res3.roles.menus.includes(item.meta.name)
    })
    newArr.push({ path: '*', redirect: '/404', hidden: true })
    // 将动态匹配的路由通过addRoutes添加就可以了
    router.addRoutes(newArr)
    // vuex的actions调用其它模块的mutations方法
    commit('routes/setRoutes', [...constantRoutes, ...newArr], { root: true })
    /*
    路由动态添加的坑点:
    1:通过动态路由的路由不能立马使用，需要再经历一次beforeEach
       解决方式：next(to.fullPath)
    2:因为通过动态添加的路由不能立马使用，但是静态路由中包含404的匹配，它会直接匹配到404去
      解决方式：将404匹配的路由通过addRoutes添加就没问题了
    */
    console.log('匹配的路由项', newArr)
  },
  xxx() {
    console.log('xxx')
  }
}
const getters = {}
export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}
